import java.util.ArrayList;
import java.util.List;

/**
 * @author zyj
 * @date 2022年06月09日 11:06
 * Object中的wait(),notify(),notifyAll()来实现
 * wait和 notify必须配合synchronized使用，
 * wait方法释放锁，notify方法不释放锁
 */
public class 线程通信方式二 {
    public static void main(String[] args) {
        Object lock = new Object();
        List<String> list = new ArrayList<>();
       new Thread(() ->{
           synchronized (lock) {
               for (int i = 0; i < 10; i++) {
                   list.add("abc");
                   System.out.println("线程A向list中添加一个元素，此时list中的元素个数为：" + list.size());
                   try {
                       Thread.sleep(500);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   if (list.size() == 5) {
                       lock.notifyAll();
                   }
               }
           }
       }).start();


       new Thread(() ->{
           while (true) {
               synchronized (lock) {
                   try {

                       if (list.size() != 5) {
                           lock.wait();
                       }
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }

                   System.out.println("线程B执行任务......");
                   break;
               }
           }
       }).start();
    }
}
